package com.qf.service.impl;

import com.qf.dao.OrderDao;
import com.qf.dao.impl.OrderDaoImpl;
import com.qf.pojo.Order;
import com.qf.pojo.OrderItem;
import com.qf.pojo.PageBean;
import com.qf.pojo.User;
import com.qf.service.OrderService;
import com.qf.utils.DruidJdbcUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 高圆圆
 * @date 2023/4/25 14:14
 * 订单业务接口实现
 */
public class OrderServiceImpl  implements OrderService {

    /**
     * 添加订单信息
     * @param order 订单实体
     */
    @Override
    public void addOrder(Order order) {
        try {



            //调用订单数据访问接口
            OrderDao orderDao = new OrderDaoImpl() ;

            //控制事务:产生订单这个业务需要同时给订单项和订单添加数据,要么同时执行成功,要么同时失败
            //获取连接对象---封装到自定义工具类中
            DruidJdbcUtils.setAutoCommit();


            //插入订单
            orderDao.insertOrder(order) ;


            //有一个异常
//            int i = 1 / 0 ;


            for(OrderItem orderItem:order.getList()){
                //插入订单项
                orderDao.insertOrderItem(orderItem);
            }

            //提交事务
            DruidJdbcUtils.commitAndClose();

        } catch (SQLException throwables) {
            //事务回滚
            try {
                DruidJdbcUtils.rollbackAndClose();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }


    }

    /**
     * 获取订单分页数据
     * @param currentPag 当前页码
     * @param pageSize 每页显示的条数
     * @param user user实体
     * @return 返回分页实体
     */
    @Override
    public PageBean<Order> getOrderListByPage(int currentPag, int pageSize, User user) {
        try {
            //调用业务接口
            OrderDao orderDao = new OrderDaoImpl() ;
            List<Order> list = orderDao.findOrderByPage(currentPag, pageSize, user) ;
            //总计数
            int totalCount = orderDao.getTotalCount(user) ;
            return new PageBean<>(currentPag,pageSize,totalCount,list);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return  null ;
    }

    /**
     * 通过订单编号获取订单实体
     * @param oid 订单编号
     * @return 返回订单实体
     */
    @Override
    public Order getOrderByOid(String oid) {
        try {
            OrderDao orderDao = new OrderDaoImpl() ;
            Order order = orderDao.selectOrderByOid(oid) ;
            if(order!=null){
                return order ;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    /**
     * 更新订单状态
     * @param order 订单实体
     */
    @Override
    public void updateOrderState(Order order) {
        try {
            //调用订单数据访问接口
            OrderDao orderDao = new OrderDaoImpl() ;
            orderDao.updateOrder(order) ;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }
}
